import os
import sys
import shutil
import subprocess
from pathlib import Path
from pyinstaller_config import (
    APP_NAME, ROOT_DIR, WINDOWS_CONFIG, MACOS_CONFIG
)

def clean_build():
    """清理构建文件"""
    print("清理旧的构建文件...")
    for path in ['build', 'dist', '*.spec']:
        for item in ROOT_DIR.glob(path):
            if item.is_file():
                item.unlink()
            elif item.is_dir():
                shutil.rmtree(item)

def create_icons():
    """创建应用图标"""
    print("创建应用图标...")
    subprocess.run([sys.executable, 'scripts/create_icons.py'], check=True)

def build_windows():
    """构建 Windows 版本"""
    print("构建 Windows 版本...")
    import PyInstaller.__main__

    # 准备参数
    args = [
        'main.py',
        f'--name={APP_NAME}',
        '--onefile',
        '--windowed',
        f'--icon={WINDOWS_CONFIG["icon"]}',
        '--clean',
        '--noconsole',
        '--hidden-import=win32gui',
        '--hidden-import=win32con',
        '--hidden-import=win32api',
        '--hidden-import=pystray._win32',
        '--hidden-import=PIL._tkinter_finder',
        '--hidden-import=websockets.legacy.client',
        '--hidden-import=websockets.legacy.server',
        '--hidden-import=websockets.legacy.protocol',
    ]
    
    # 添加数据文件
    args.extend([
        '--add-data', f'ws_notifier/gui/assets/*;ws_notifier/gui/assets',
        '--add-binary', f'ws_notifier/gui/assets/*;ws_notifier/gui/assets',
    ])
    
    # 执行打包
    PyInstaller.__main__.run(args)

def build_macos():
    """构建 macOS 版本"""
    print("构建 macOS 版本...")
    import PyInstaller.__main__

    # 准备参数
    args = [
        'main.py',
        f'--name={APP_NAME}',
        '--windowed',
        f'--icon={MACOS_CONFIG["icon"]}',
        '--clean',
    ]
    
    # 添加隐藏导入
    for imp in MACOS_CONFIG['hidden_imports']:
        args.append(f'--hidden-import={imp}')
    
    # 添加数据文件
    args.append('--add-data=ws_notifier/gui/assets/*:ws_notifier/gui/assets')
    
    # 执行打包
    PyInstaller.__main__.run(args)
    
    # 后处理
    app_path = ROOT_DIR / 'dist' / f'{APP_NAME}.app'
    if app_path.exists():
        # 设置执行权限
        exe_path = app_path / 'Contents' / 'MacOS' / APP_NAME
        os.chmod(exe_path, 0o755)
        
        # 签名应用（如果有证书）
        try:
            subprocess.run(['codesign', '--force', '--deep', '--sign', 'Developer ID Application', str(app_path)])
        except subprocess.CalledProcessError:
            print("警告: 应用签名失败（这不影响程序运行）")
        
        # 创建 DMG（如果有工具）
        try:
            subprocess.run([
                'create-dmg',
                '--volname', APP_NAME,
                '--volicon', MACOS_CONFIG['icon'],
                '--window-pos', '200', '120',
                '--window-size', '600', '300',
                '--icon-size', '100',
                '--icon', f'{APP_NAME}.app', '175', '120',
                '--hide-extension', f'{APP_NAME}.app',
                '--app-drop-link', '425', '120',
                f'dist/{APP_NAME}.dmg',
                str(app_path)
            ])
        except (subprocess.CalledProcessError, FileNotFoundError):
            print("警告: DMG 创建失败（这不影响程序运行）")

def main():
    """主函数"""
    # 切换到脚本目录
    os.chdir(ROOT_DIR)
    
    # 清理旧的构建文件
    clean_build()
    
    # 创建图标
    create_icons()
    
    # 根据平台构建
    if sys.platform == 'win32':
        build_windows()
    elif sys.platform == 'darwin':
        build_macos()
    else:
        print("错误: 不支持的操作系统")
        sys.exit(1)
    
    print("打包完成！")
    print("输出目录:", ROOT_DIR / 'dist')

if __name__ == '__main__':
    main() 